今天是第11天我們可以寫一個yolo 辨識系統來模擬養隻已減少人工養豬的人力,以下是程式碼
import cv2
import numpy as np
import torch
from pathlib import Path
# 載入 YOLO 模型
model = torch.hub.load('ultralytics/yolov8', 'yolov8s') # 選擇模型版本,例如yolov8s, yolov8m等
def detect_pigs(image_path):
# 讀取圖片
img = cv2.imread(image_path)
# 使用 YOLO 模型進行推論
results = model(img)
# 取得檢測結果
labels, coords = results.xyxyn[0][:, -1], results.xyxyn[0][:, :-1]
# 設定豬隻類別 ID(假設為 0,需依據實際模型類別設定)
pig_class_id = 0
for i, (label, coord) in enumerate(zip(labels, coords)):
if label == pig_class_id:
x1, y1, x2, y2, conf = coord
if conf > 0.5: # 只考慮置信度高於 50% 的檢測
start_point = (int(x1 * img.shape[1]), int(y1 * img.shape[0]))
end_point = (int(x2 * img.shape[1]), int(y2 * img.shape[0]))
img = cv2.rectangle(img, start_point, end_point, (255, 0, 0), 2)
img = cv2.putText(img, f'Pig {conf:.2f}', start_point, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
# 儲存或顯示結果
output_path = "output_" + Path(image_path).name
cv2.imwrite(output_path, img)
print(f"檢測結果已儲存至 {output_path}")
# 呼叫 detect_pigs 函數進行檢測
detect_pigs('path_to_your_pig_image.jpg')
import cv2
import numpy as np
import torch
from pathlib import Path
這段代碼導入了所需的 Python 庫:
cv2
:OpenCV 庫,用於圖像處理。numpy
:用於處理數組(此範例中未使用,但通常和 OpenCV 一起使用)。torch
:PyTorch 庫,用於加載和運行 YOLO 模型。Path
:用於處理路徑名稱的庫。# 載入 YOLO 模型
model = torch.hub.load('ultralytics/yolov8', 'yolov8s') # 選擇模型版本,例如yolov8s, yolov8m等
這行代碼透過 torch.hub.load
方法從 ultralytics 的 YOLOv8 模型庫中加載 yolov8s
模型。yolov8s
是 YOLOv8 的一個版本(其中 s
代表 small),你可以根據需求選擇不同大小的模型,例如 yolov8m
(medium)、yolov8l
(large)等。
def detect_pigs(image_path):
# 讀取圖片
img = cv2.imread(image_path)
detect_pigs
是一個函數,用於在指定圖片中偵測豬隻。這裡使用 OpenCV (cv2.imread
) 加載圖片。
# 使用 YOLO 模型進行推論
results = model(img)
這行代碼使用先前加載的 YOLO 模型來對圖片進行推論(也就是進行物件偵測)。results
變數將保存 YOLO 模型對圖片中物件的檢測結果。
# 取得檢測結果
labels, coords = results.xyxyn[0][:, -1], results.xyxyn[0][:, :-1]
這行代碼從 results
中提取檢測結果:
labels
:檢測到的物件的類別標籤。coords
:檢測到的物件的坐標和置信度。results.xyxyn
是 YOLO 模型返回的數據結構,包含了每個檢測到的物件的邊界框坐標 (x1, y1, x2, y2) 和置信度 (confidence)。
# 設定豬隻類別 ID(假設為 0,需依據實際模型類別設定)
pig_class_id = 0
這行定義了豬隻的類別 ID,假設在這個 YOLO 模型中豬隻的類別 ID 為 0
。實際的類別 ID 需要根據使用的模型來確定。
for i, (label, coord) in enumerate(zip(labels, coords)):
if label == pig_class_id:
x1, y1, x2, y2, conf = coord
if conf > 0.5: # 只考慮置信度高於 50% 的檢測
start_point = (int(x1 * img.shape[1]), int(y1 * img.shape[0]))
end_point = (int(x2 * img.shape[1]), int(y2 * img.shape[0]))
img = cv2.rectangle(img, start_point, end_point, (255, 0, 0), 2)
img = cv2.putText(img, f'Pig {conf:.2f}', start_point, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
這段代碼遍歷所有檢測結果:
label
等於 pig_class_id
,表示檢測到的物件是豬隻。x1, y1, x2, y2
) 和置信度 (conf
)。cv2.rectangle
在圖片上繪製矩形框來標示豬隻的位置,並使用 cv2.putText
在矩形框旁顯示 "Pig" 和置信度。 # 儲存或顯示結果
output_path = "output_" + Path(image_path).name
cv2.imwrite(output_path, img)
print(f"檢測結果已儲存至 {output_path}")
這段代碼將處理過的圖片儲存為新文件,並將文件名稱設定為原圖片名稱前加上 output_
。最後,打印一條消息,告知結果已儲存的位置。
# 呼叫 detect_pigs 函數進行檢測
detect_pigs('path_to_your_pig_image.jpg')
這行代碼呼叫 detect_pigs
函數,並將圖片路徑作為參數傳遞進去。替換 'path_to_your_pig_image.jpg'
為實際的豬隻圖片路徑,系統就會對該圖片進行檢測並儲存結果。
這個程式是一個使用 YOLOv8 進行豬隻偵測。